package com.rc.common.util;

import com.mybatisflex.core.util.EnumWrapper;
import com.rc.common.constant.RoleEnum;
import org.apache.ibatis.type.BaseTypeHandler;
import org.apache.ibatis.type.JdbcType;

import java.sql.CallableStatement;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

/**
 * 用户角色类型处理器
 * 用于处理MyBatis中RoleEnum枚举类型与数据库字段的映射
 */
public class UserRoleTypeHandler extends BaseTypeHandler<RoleEnum> {
    // 枚举包装器，用于处理枚举值与数据库值的转换
    private final EnumWrapper<RoleEnum> enumWrapper = EnumWrapper.of(RoleEnum.class);

    /**
     * 设置非空参数
     * @param ps PreparedStatement对象
     * @param i 参数位置
     * @param parameter 要设置的RoleEnum枚举值
     * @param jdbcType JDBC类型
     * @throws SQLException SQL异常
     */
    @Override
    public void setNonNullParameter(PreparedStatement ps, int i, RoleEnum parameter, JdbcType jdbcType) throws SQLException {
        // 获取枚举对应的值
        Object value = enumWrapper.getEnumValue(parameter);
        // 根据jdbcType设置参数
        if (jdbcType == null) {
            ps.setObject(i, value);
        } else {
            ps.setObject(i, value, jdbcType.TYPE_CODE);
        }
    }

    /**
     * 从结果集中获取枚举值
     * @param rs 结果集
     * @param columnName 列名
     * @return 对应的RoleEnum枚举值
     * @throws SQLException SQL异常
     */
    @Override
    public RoleEnum getNullableResult(ResultSet rs, String columnName) throws SQLException {
        // 从结果集中获取整数值
        Object value = rs.getInt(columnName);
        // 将整数值转换为枚举
        return enumWrapper.getEnum(value);
    }

    @Override
    public RoleEnum getNullableResult(ResultSet rs, int columnIndex) throws SQLException {
        return null;
    }

    @Override
    public RoleEnum getNullableResult(CallableStatement cs, int columnIndex) throws SQLException {
        return null;
    }
}
